/**
 * @file    app_scene.h
 * @author  Azolla (1228449928@qq.com)
 * @brief
 * @version 0.1
 * @date    2023-02-28
 * 
 * @copyright Copyright (c) 2023
 * */
#ifndef __APP_SCENE_H__
#define __APP_SCENE_H__

//======================================================
//======================================================
typedef struct {
#define ARRAY_TYPE  uint8_t     /* 定义[void *value] 为数组类型时的数据类型 */
    uint8_t addr[6];
    char    *name;
    void    *value;
    cJSON   *json;   // 存放原始JSON的
    uint16_t size;
    bool     is_scene;   // 1: 是情景解析；0：云端解析
} app_parse_data_t;

#define APP_PARSE_NULL  0x00
#define APP_PARSE_ROOT  0x01
#define APP_PARSE_NODE  0x02
#define APP_PARSE_EXIT  0xFF   // 退出
//======================================================
//======================================================

#define SCENE_NAME_SLEEP    "1"         // 睡眠情景名固定为"1"
#define SCENE_NAME_WAKEUP   "2"         // 唤醒情景名固定为"2"

#define SCENE_ACTION_START  "start"     // 情景动作开始
#define SCENE_ACTION_STOP   "stop"      // 情景动作停止

#define SCENE_NAME_LEN      3       // 情景名长度
#define SCENE_EVENT_NUM     8       // 最大情景数
 
typedef struct {
    char name[SCENE_NAME_LEN];      // 场景名/场景ID
    struct {    
        uint8_t  week;      // 触发星期
        uint16_t time;      // 触发时间
        uint16_t dtime;     // duration time持续时间
    };  // "timer"
    struct {   
        uint8_t addr[6];    // 地址
        char instruct[44];  // 条件完整JSON指令
    };  // "device"
} trigger_event_t;      // 设备触发事件
 
typedef struct {
    trigger_event_t event[SCENE_EVENT_NUM];  
    uint8_t total;   // 有几个条件
} scene_trigger_t;   // 情景触发条件，支持同时：时间在时间内+设备触发

//======================================================
//======================================================

void app_scene_init(void);

void scene_write(const char *name, const char *text);

int scene_read(const char *name, char *text);

int scene_delete(const char *name);

bool scene_update_event(void);

int app_scene_action(const char *name, const char *action);

bool scene_read_tigger(scene_trigger_t *trigger);
 
#endif  /*__APP_SCENE_H__ END.*/
